package br.com.saeng2D.formulario.caixa_reacao;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import br.com.saeng2D.formulario.caixa.ContainerAnimado;
import br.com.saeng2D.formulario.caixa.Dialogo;
import br.com.saeng2D.formulario.caixa.GrupoContainerAnimado;
import br.com.saeng2D.objeto.forca.ForcaCentralizada;
import br.com.saeng2D.objeto.forca.ForcaMomento;
import br.com.saeng2D.objeto.ponto.Ponto;
import br.com.saeng2D.superficie.Superficie;
import br.com.saeng2D.util.Constantes;
import br.com.saeng2D.util.P2D;
import br.com.saeng2D.util.Util;

//Caixa de dialogo para selecionamento de um objeto do tipo apoio
public class DialogoReacao extends Dialogo {
	private static final long serialVersionUID = 1L;
	private ControleContainerAnimadoForcaReacao_C controleContainerAnimadoForcaReacao_Cn;
	private ControleContainerAnimadoForcaReacao_C controleContainerAnimadoForcaReacao_Cs;
	private ControleContainerAnimadoForcaReacao_C controleContainerAnimadoForcaReacao_Cl;
	private ControleContainerAnimadoForcaReacao_C controleContainerAnimadoForcaReacao_Co;

	private ControleContainerAnimadoForcaReacao_M controleContainerAnimadoForcaReacao_Mh;
	private ControleContainerAnimadoForcaReacao_M controleContainerAnimadoForcaReacao_Ma;
	
	private Ponto ponto1;
	private Ponto ponto2;
	private Ponto ponto;
	
	public DialogoReacao(Superficie superficie, Ponto ponto) {
		super(superficie);
		this.ponto = (Ponto) ponto.prototipo();
		this.ponto1 = (Ponto) ponto.prototipo();
		this.ponto2 = (Ponto) ponto.prototipo();
		montarLayout2();
		registrarEvento2();
		setVisible(true);
	}
	
	private List<ForcaCentralizada> getForcasCentralizadasSelecionadas() {
		List<ForcaCentralizada> lista = new ArrayList<ForcaCentralizada>();
		if(controleContainerAnimadoForcaReacao_Cn.getContainerAnimado().isSelecionado()) {
			lista.add((ForcaCentralizada) controleContainerAnimadoForcaReacao_Cn.getContainerAnimado().getAbstratoAnimado());
		}
		if(controleContainerAnimadoForcaReacao_Cs.getContainerAnimado().isSelecionado()) {
			lista.add((ForcaCentralizada) controleContainerAnimadoForcaReacao_Cs.getContainerAnimado().getAbstratoAnimado());
		}
		if(controleContainerAnimadoForcaReacao_Cl.getContainerAnimado().isSelecionado()) {
			lista.add((ForcaCentralizada) controleContainerAnimadoForcaReacao_Cl.getContainerAnimado().getAbstratoAnimado());
		}
		if(controleContainerAnimadoForcaReacao_Co.getContainerAnimado().isSelecionado()) {
			lista.add((ForcaCentralizada) controleContainerAnimadoForcaReacao_Co.getContainerAnimado().getAbstratoAnimado());
		}
		return lista;
	}
	
	private List<ForcaMomento> getForcasMomentosCentralizadas() {
		List<ForcaMomento> lista = new ArrayList<ForcaMomento>();
		if(controleContainerAnimadoForcaReacao_Mh.getContainerAnimado().isSelecionado()) {
			lista.add((ForcaMomento) controleContainerAnimadoForcaReacao_Mh.getContainerAnimado().getAbstratoAnimado());
		}
		if(controleContainerAnimadoForcaReacao_Ma.getContainerAnimado().isSelecionado()) {
			lista.add((ForcaMomento) controleContainerAnimadoForcaReacao_Ma.getContainerAnimado().getAbstratoAnimado());
		}
		return lista;
	}
	
	private void montarLayout2() {
//		GrupoContainerAnimado grupo = new GrupoContainerAnimado();

		ForcaCentralizada forcaCentralizadaCs = new ForcaCentralizada(40, 10);
		forcaCentralizadaCs.rotacionar(180);
		forcaCentralizadaCs.setVariavelForca("V");// + Util.getString("label_simbolo_grau"));
		forcaCentralizadaCs.criarMemento();
		forcaCentralizadaCs.setVariavelForca("");
		ContainerAnimado containerAnimadoCs = new ContainerAnimado(forcaCentralizadaCs);
		controleContainerAnimadoForcaReacao_Cs = new ControleContainerAnimadoForcaReacao_C(Util.getString("label_reacao_vertical"), containerAnimadoCs, this, 128, 10, 105, 95);
		panelCentral.add(controleContainerAnimadoForcaReacao_Cs);
//		grupo.adicionarContainerAnimado(containerAnimadoCs);
		
		ForcaCentralizada forcaCentralizadaCn = new ForcaCentralizada(40, 45);
		forcaCentralizadaCn.setVariavelForca("V");// + Util.getString("label_simbolo_grau"));
		forcaCentralizadaCn.criarMemento();
		forcaCentralizadaCn.setVariavelForca("");
		ContainerAnimado containerAnimadoCn = new ContainerAnimado(forcaCentralizadaCn);
		controleContainerAnimadoForcaReacao_Cn = new ControleContainerAnimadoForcaReacao_C(Util.getString("label_reacao_vertical"), containerAnimadoCn, this, 128, 200, 105, 95);
		panelCentral.add(controleContainerAnimadoForcaReacao_Cn);
//		grupo.adicionarContainerAnimado(containerAnimadoCn);

		ForcaCentralizada forcaCentralizadaCo = new ForcaCentralizada(55, 25);
		forcaCentralizadaCo.rotacionar(90);
		forcaCentralizadaCo.setVariavelForca("H");// + Util.getString("label_simbolo_grau"));
		forcaCentralizadaCo.criarMemento();
		forcaCentralizadaCo.setVariavelForca("");
		ContainerAnimado containerAnimadoCo = new ContainerAnimado(forcaCentralizadaCo);

		controleContainerAnimadoForcaReacao_Co = new ControleContainerAnimadoForcaReacao_C(Util.getString("label_reacao_horizontal"), containerAnimadoCo, this, 233, 105, 118, 95);


		panelCentral.add(controleContainerAnimadoForcaReacao_Co);
//		grupo.adicionarContainerAnimado(containerAnimadoCo);

		ForcaCentralizada forcaCentralizadaCl = new ForcaCentralizada(15, 25);
		forcaCentralizadaCl.rotacionar(270);
		forcaCentralizadaCl.setVariavelForca("H");// + Util.getString("label_simbolo_grau"));
		forcaCentralizadaCl.criarMemento();
		forcaCentralizadaCl.setVariavelForca("");
		ContainerAnimado containerAnimadoCl = new ContainerAnimado(forcaCentralizadaCl);

		controleContainerAnimadoForcaReacao_Cl = new ControleContainerAnimadoForcaReacao_C(Util.getString("label_reacao_horizontal"), containerAnimadoCl, this, 10, 105, 118, 95);

		panelCentral.add(controleContainerAnimadoForcaReacao_Cl);
//		grupo.adicionarContainerAnimado(containerAnimadoCl);
		
		ponto1.setX(25);
		ponto1.setY(25);
		ContainerPonto containerPonto1 = new ContainerPonto(ponto1);
		containerPonto1.setBounds(155, 125, 50, 50);
		panelCentral.add(containerPonto1);
		
		GrupoContainerAnimado grupo2 = new GrupoContainerAnimado();

		ForcaMomento forcaMomentoMh = new ForcaMomento(40, 25);
		//forcaMomentoMh.setSentidoPosOuNeg(true);
		forcaMomentoMh.setVariavelForca("M");// + Util.getString("label_simbolo_grau"));
		forcaMomentoMh.criarMemento();
		forcaMomentoMh.setVariavelForca("");
		ContainerAnimado containerAnimadoMh = new ContainerAnimado(forcaMomentoMh);

		controleContainerAnimadoForcaReacao_Mh = new ControleContainerAnimadoForcaReacao_M(Util.getString("label_reacao_momento"), containerAnimadoMh, this,380, 10, 115, 95);


		panelCentral.add(controleContainerAnimadoForcaReacao_Mh);
		grupo2.adicionarContainerAnimado(containerAnimadoMh);
		
		ForcaMomento forcaMomentoMa = new ForcaMomento(40, 25);
		forcaMomentoMa.setSentidoPosOuNeg(false);
		forcaMomentoMa.setVariavelForca("M");// + Util.getString("label_simbolo_grau"));
		forcaMomentoMa.criarMemento();
		forcaMomentoMa.setVariavelForca("");
		ContainerAnimado containerAnimadoMa = new ContainerAnimado(forcaMomentoMa);

		controleContainerAnimadoForcaReacao_Ma = new ControleContainerAnimadoForcaReacao_M(Util.getString("label_reacao_momento"), containerAnimadoMa, this, 380, 200, 115, 95);


		panelCentral.add(controleContainerAnimadoForcaReacao_Ma);
		grupo2.adicionarContainerAnimado(containerAnimadoMa);
		
		ponto2.setX(25);
		ponto2.setY(25);
		ContainerPonto containerPonto2 = new ContainerPonto(ponto2);
		containerPonto2.setBounds(410, 125, 50,50);
		panelCentral.add(containerPonto2);
		
		//setSize(520, 370);
		setBounds(100, 76, 520, 370);
		//Util.centralizar(this, superficie.getFormularioPrincipal());
	}

	private void registrarEvento2() {
		buttonAdicionar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				adicionarApoioNaSuperficie();
			}
		});
	}

	public void adicionarNaSuperficie() {
		adicionarApoioNaSuperficie();
	}
	
	private void adicionarApoioNaSuperficie() {
		if(Constantes.TIPO_PONTO_GENERO_1.equals(ponto1.getTipoPonto())) {
			List<ForcaCentralizada> listaForcaCentralizada = getForcasCentralizadasSelecionadas();
			List<ForcaMomento> listaForcaMomento = getForcasMomentosCentralizadas();
			if(!listaForcaMomento.isEmpty()) {
				Util.mensagem(this, Util.getString("msg_dialogo_reacao_ponto_genero_1_momento_selecionado"));
				return;
			}
			if(listaForcaCentralizada.isEmpty()) {
				Util.mensagem(this, Util.getString("msg_dialogo_reacao_ponto_genero_1_nao_selecionado"));
				return;
			} 
			if(listaForcaCentralizada.size() > 1) {
				Util.mensagem(this, Util.getString("msg_dialogo_reacao_ponto_genero_1_multiplos_selecionados"));
				return;
			}
			for (ForcaCentralizada forcaCentralizada : listaForcaCentralizada) {
				P2D p2d = forcaCentralizada.getVetorReferencia().criarP2D();
				forcaCentralizada.restaurarMemento();
				forcaCentralizada.setVariavelForca(forcaCentralizada.getVariavelForca() + ponto1.getNumero());
				forcaCentralizada.setX(ponto.getX() - p2d.x);
				forcaCentralizada.setY(ponto.getY() + p2d.y);
//				forcaCentralizada.setX(ponto.getX());
//				forcaCentralizada.setY(ponto.getY());
				superficie.adicionarObjeto(forcaCentralizada);
			}
			for (ForcaMomento forcaMomento : listaForcaMomento) {
				forcaMomento.restaurarMemento();
				forcaMomento.alterarTamanho(Util.getInt("tamanho_padrao_forca_momento"));
				forcaMomento.setVariavelForca(forcaMomento.getVariavelForca() + ponto1.getNumero());
				forcaMomento.setX(ponto.getX());
				forcaMomento.setY(ponto.getY());
				superficie.adicionarObjeto(forcaMomento); 
			}
			dispose();
		} else if(Constantes.TIPO_PONTO_GENERO_2.equals(ponto1.getTipoPonto())) {
			List<ForcaCentralizada> listaForcaCentralizada = getForcasCentralizadasSelecionadas();
			List<ForcaMomento> listaForcaMomento = getForcasMomentosCentralizadas();
			if(!listaForcaMomento.isEmpty()) {
				Util.mensagem(this, Util.getString("msg_dialogo_reacao_ponto_genero_2_momento_selecionado"));
				return;
			}
			if(listaForcaCentralizada.isEmpty()) {
				Util.mensagem(this, Util.getString("msg_dialogo_reacao_ponto_genero_2_nao_selecionado"));
				return;
			} 
			if(listaForcaCentralizada.size() != 2) {
				Util.mensagem(this, Util.getString("msg_dialogo_reacao_ponto_genero_2_dif_2_selecionados"));
				return;
			}
			for (ForcaCentralizada forcaCentralizada : listaForcaCentralizada) {
				P2D p2d = forcaCentralizada.getVetorReferencia().criarP2D();
				forcaCentralizada.restaurarMemento();
				forcaCentralizada.setVariavelForca(forcaCentralizada.getVariavelForca() + ponto1.getNumero());
				forcaCentralizada.setX(ponto.getX() - p2d.x);
				forcaCentralizada.setY(ponto.getY() + p2d.y);
//				forcaCentralizada.setX(ponto.getX());
//				forcaCentralizada.setY(ponto.getY());
				superficie.adicionarObjeto(forcaCentralizada);
			}
			for (ForcaMomento forcaMomento : listaForcaMomento) {
				forcaMomento.restaurarMemento();
				forcaMomento.alterarTamanho(Util.getInt("tamanho_padrao_forca_momento"));
				forcaMomento.setVariavelForca(forcaMomento.getVariavelForca() + ponto1.getNumero());
				forcaMomento.setX(ponto.getX());
				forcaMomento.setY(ponto.getY());
				superficie.adicionarObjeto(forcaMomento); 
			}
			dispose();
		} else if(Constantes.TIPO_PONTO_GENERO_3.equals(ponto1.getTipoPonto())) {
			List<ForcaCentralizada> listaForcaCentralizada = getForcasCentralizadasSelecionadas();
			List<ForcaMomento> listaForcaMomento = getForcasMomentosCentralizadas();

			if(listaForcaMomento.size() != 1) {
				Util.mensagem(this, Util.getString("msg_dialogo_reacao_ponto_genero_3_momento_nao_selecionado"));
				return;
			}
			
			if(listaForcaCentralizada.isEmpty()) {
				Util.mensagem(this, Util.getString("msg_dialogo_reacao_ponto_genero_3_nao_selecionado"));
				return;
			} 
			
			if(listaForcaCentralizada.size() != 2) {
				Util.mensagem(this, Util.getString("msg_dialogo_reacao_ponto_genero_3_dif_2_selecionados"));
				return;
			}
			for (ForcaCentralizada forcaCentralizada : listaForcaCentralizada) {
				P2D p2d = forcaCentralizada.getVetorReferencia().criarP2D();
				forcaCentralizada.restaurarMemento();
				forcaCentralizada.setVariavelForca(forcaCentralizada.getVariavelForca() + ponto1.getNumero());
				forcaCentralizada.setX(ponto.getX() - p2d.x);
				forcaCentralizada.setY(ponto.getY() + p2d.y);
//				forcaCentralizada.setX(ponto.getX());
//				forcaCentralizada.setY(ponto.getY());
				superficie.adicionarObjeto(forcaCentralizada);
			}
			for (ForcaMomento forcaMomento : listaForcaMomento) {
				forcaMomento.restaurarMemento();
				forcaMomento.alterarTamanho(Util.getInt("tamanho_padrao_forca_momento"));
				forcaMomento.setVariavelForca(forcaMomento.getVariavelForca() + ponto1.getNumero());
				forcaMomento.setX(ponto.getX());
				forcaMomento.setY(ponto.getY());
				superficie.adicionarObjeto(forcaMomento); 
			}
			dispose();
		}
	}
}
